class MonitoramentoController < ApplicationController
  SERVIDOR_1 = 1
  SERVIDOR_2 = 2
  ARQUIVO_SERVIDOR_1 = "d:/xxx.log"
  ARQUIVO_SERVIDOR_2 = "d:/yyy.log"

  OPERACOES = ['NfeRecepcao.nfeRecepcaoLote',
               'NfeRetRecepcao.nfeRetRecepcao',
               'NfeStatusServico.nfeStatusServicoNF',
               'NfeConsulta.nfeConsultaNF',
               'CadConsultaCadastro.consultaCadastro',
               'NfeInutilizacao.nfeInutilizacaoNF',
               'NfeCancelamento.nfeCancelamentoNF',

               'NotaFiscalManager.findByChaveAcesso',
               'NotaFiscalManager.autorizar',
               'NotaFiscalManager.cancelar',
               'NotaFiscalManager.findByAnoCnpjModeloSerieNumero',
               'NotaFiscalManager.existeNotaByAnoCnpjModeloSerieNumeroIniFim',
               'LoteManager.incorporar',
               'LoteManager.atualizar',
               'LoteManager.findByNumeroRecibo',
               'ContribuinteManager.findByNumeroIE',
               'ContribuinteManager.findByNumeroCNPJ',
               'TeddistManager.enviarNota',
               'TeddistManager.enviarCancelamento',
               'TeddistManager.enviarInutilizacao',
               'TeddistManager.findByNumeroProtocolo',
               'InutilizacaoManager.inutilizar',
               'InutilizacaoManager.isFaixaInutilizacaoValida',
               'InutilizacaoManager.findByAnoCnpjModeloSerieNumero',
               'LogManager.gravarLog',

               'A', 'B', 'C', 'D', 'E', 'F',
               'G02', 'G03', 'G03a', 'G03b', 'G04', 'G05', 'G05a', 'G05b', 'G06',
               'G06a', 'G06b', 'G06c', 'G06d', 'G07', 'G08', 'G08a', 'G09', 'G10',
               'G10a', 'G10b', 'G11', 'G11a', 'G12', 'G13', 'G13a', 'G14', 'G15',
               'G16', 'G17', 'G18', 'G19', 'G20', 'G21', 'G22', 'G23', 'G24', 'G25',
               'G25a', 'G25b', 'G25c', 'G25d', 'G25e', 'G25f', 'G26', 'G29', 'G30',
               'H02', 'H03', 'H04', 'H05', 'H06', 'H07', 'H08', 'H10', 'H11', 'H13',
               'I02', 'I03', 'I04', 'I05', 'I06', 'I07', 'I08', 'J02', 'J03', 'J04',
               'K02', 'L01', 'L02', 'L03', 'L04', 'L05', 'L06', 'L07', 'M02', 'M03',
               'M04', 'M05', 'TIPO_AMB' ]

  NOMES_OPERACOES = { 0   => 'WS Recepção de Lotes',
                      1   => 'WS Retorno da Recepção',
                      2   => 'WS Status do Serviço',
                      3   => 'WS Consulta NF-e',
                      4   => 'WS Consulta Cadastro',
                      5   => 'WS Inutilização de NF-e',
                      6   => 'WS Cancelamento de NF-e',
                      7   => 'OP Buscar Nota pela Chave de Acesso',
                      8   => 'OP Autorizar NF-e',
                      9   => 'OP Cancelar NF-e',
                      10  => 'OP Buscar Nota por Ano Cnpj Modelo Serie Numero',
                      11  => 'OP Buscar Nota por Ano Cnpj Modelo Serie Numero Ini Fim',
                      12  => 'OP Incorporar Lote',
                      13  => 'OP Atualizar Lote',
                      14  => 'OP Buscar Lote por Numero do Recibo',
                      15  => 'OP Buscar Contribuinte por Numero IE',
                      16  => 'OP Buscar Contribuinte por Numero CNPJ',
                      17  => 'OP Enviar Nota TEDDIST',
                      18  => 'OP Enviar Cancelamento TEDDIST',
                      19  => 'OP Enviar Inutilizacao TEDDIST',
                      20  => 'OP Buscar TedDist pro Numero do Protocolo',
                      21  => 'OP Inutilizar NF-e',
                      22  => 'OP Validar Faixa de Inutilizacao',
                      23  => 'OP Buscar Inutilizacao por Ano Cnpj Modelo Serie Numero',
                      24  => 'OP Gravar Log Servico',
                      25  => 'RN ' + OPERACOES[25],
                      26  => 'RN ' + OPERACOES[26],
                      27  => 'RN ' + OPERACOES[27],
                      28  => 'RN ' + OPERACOES[28],
                      29  => 'RN ' + OPERACOES[29],
                      30  => 'RN ' + OPERACOES[30],
                      31  => 'RN ' + OPERACOES[31],
                      32  => 'RN ' + OPERACOES[32],
                      33  => 'RN ' + OPERACOES[33],
                      34  => 'RN ' + OPERACOES[34],
                      35  => 'RN ' + OPERACOES[35],
                      36  => 'RN ' + OPERACOES[36],
                      37  => 'RN ' + OPERACOES[37],
                      38  => 'RN ' + OPERACOES[38],
                      39  => 'RN ' + OPERACOES[39],
                      40  => 'RN ' + OPERACOES[40],
                      41  => 'RN ' + OPERACOES[41],
                      42  => 'RN ' + OPERACOES[42],
                      43  => 'RN ' + OPERACOES[43],
                      44  => 'RN ' + OPERACOES[44],
                      45  => 'RN ' + OPERACOES[45],
                      46  => 'RN ' + OPERACOES[46],
                      47  => 'RN ' + OPERACOES[47],
                      48  => 'RN ' + OPERACOES[48],
                      49  => 'RN ' + OPERACOES[49],
                      50  => 'RN ' + OPERACOES[50],
                      51  => 'RN ' + OPERACOES[51],
                      52  => 'RN ' + OPERACOES[52],
                      53  => 'RN ' + OPERACOES[53],
                      54  => 'RN ' + OPERACOES[54],
                      55  => 'RN ' + OPERACOES[55],
                      56  => 'RN ' + OPERACOES[56],
                      57  => 'RN ' + OPERACOES[57],
                      58  => 'RN ' + OPERACOES[58],
                      59  => 'RN ' + OPERACOES[59],
                      60  => 'RN ' + OPERACOES[60],
                      61  => 'RN ' + OPERACOES[61],
                      62  => 'RN ' + OPERACOES[62],
                      63  => 'RN ' + OPERACOES[63],
                      64  => 'RN ' + OPERACOES[64],
                      65  => 'RN ' + OPERACOES[65],
                      66  => 'RN ' + OPERACOES[66],
                      67  => 'RN ' + OPERACOES[67],
                      68  => 'RN ' + OPERACOES[68],
                      69  => 'RN ' + OPERACOES[69],
                      70  => 'RN ' + OPERACOES[70],
                      71  => 'RN ' + OPERACOES[71],
                      72  => 'RN ' + OPERACOES[72],
                      73  => 'RN ' + OPERACOES[73],
                      74  => 'RN ' + OPERACOES[74],
                      75  => 'RN ' + OPERACOES[75],
                      76  => 'RN ' + OPERACOES[76],
                      77  => 'RN ' + OPERACOES[77],
                      78  => 'RN ' + OPERACOES[78],
                      79  => 'RN ' + OPERACOES[79],
                      80  => 'RN ' + OPERACOES[80],
                      81  => 'RN ' + OPERACOES[81],
                      82  => 'RN ' + OPERACOES[82],
                      83  => 'RN ' + OPERACOES[83],
                      84  => 'RN ' + OPERACOES[84],
                      85  => 'RN ' + OPERACOES[85],
                      86  => 'RN ' + OPERACOES[86],
                      87  => 'RN ' + OPERACOES[87],
                      88  => 'RN ' + OPERACOES[88],
                      89  => 'RN ' + OPERACOES[89],
                      90  => 'RN ' + OPERACOES[90],
                      91  => 'RN ' + OPERACOES[91],
                      92  => 'RN ' + OPERACOES[92],
                      93  => 'RN ' + OPERACOES[93],
                      94  => 'RN ' + OPERACOES[94],
                      95  => 'RN ' + OPERACOES[95],
                      96  => 'RN ' + OPERACOES[96],
                      97  => 'RN ' + OPERACOES[97],
                      98  => 'RN ' + OPERACOES[98],
                      99  => 'RN ' + OPERACOES[99],
                      100 => 'RN ' + OPERACOES[100],
                      101 => 'RN ' + OPERACOES[101],
                      102 => 'RN ' + OPERACOES[102],
                      103 => 'RN ' + OPERACOES[103],
                      104 => 'RN ' + OPERACOES[104],
                      105 => 'RN ' + OPERACOES[105],
                      106 => 'RN ' + OPERACOES[106],
                      107 => 'RN ' + OPERACOES[107],
                      108 => 'RN ' + OPERACOES[108],
                      109 => 'RN ' + OPERACOES[109] }

  # As dimensões do grafico são uma aproximação da razão aurea
  LARGURA = 600
  ALTURA  = 371

  def index

    #Gera um array com as opções e indices para ser usado como parametro do metodo
    #options_for_select do helper que gera o combo de operacoes
    @opcoes_combo_operacao = NOMES_OPERACOES.select {|k,v| true}
    @opcoes_combo_operacao.collect! { |x| [x[1],x[0]] }
    @opcoes_combo_operacao.sort! { |x,y| x[1] <=> y[1] }

    @tempo_resposta_instantaneo = ""
    @quantitativo_instantaneo = ""

    @tempo_resposta_horario = ""
    @quantitativo_horario = ""

    @tempo_resposta_diario = ""
    @quantitativo_diario = ""

    @tempo_resposta_mensal = ""
    @quantitativo_mensal = ""

    @tempo_resposta_anual = ""
    @quantitativo_anual = ""

    @operacao = params[:operacao].to_i || 0

#    case params[:grafico]
#    when 'diario':
#
#      filtro = params[:filtro_diario] || {}
#      @ano = filtro['ano_mes(1i)'] ? filtro['ano_mes(1i)'] : Time.now.strftime('%Y')
#
#      filtro['ano_mes(2i)'] ||= Time.now.strftime('%m')
#      @mes = filtro['ano_mes(2i)'].rjust(2,"0")
#
#      @tempo_resposta_diario = open_flash_chart_object(tamanho_horizontal,tamanho_vertical,"/estatisticas_nfe/grafico_diario_tempo_resposta?ano=#{@ano}&mes=#{@mes}&operacao=#{@operacao}")
#      @quantitativo_diario = open_flash_chart_object(tamanho_horizontal,tamanho_vertical,"/estatisticas_nfe/grafico_diario_quantitativo?ano=#{@ano}&mes=#{@mes}&operacao=#{@operacao}")

#    when 'mensal':

#      filtro = params[:filtro_mensal] || {}
#      @ano = filtro['ano_mes(1i)'] ? filtro['ano_mes(1i)'].to_i : Time.now.strftime('%Y').to_i
#
#      @tempo_resposta_mensal = grafico_mensal_tempo_resposta(@ano, @operacao)
#      @quantitativo_mensal = grafico_mensal_quantitativo(@ano, @operacao)
#
#      puts @tempo_resposta_mensal
#      puts @quantitativo_mensal
      
#    when 'anual':
#
#      @tempo_resposta_anual = open_flash_chart_object(tamanho_horizontal,tamanho_vertical,"/estatisticas_nfe/grafico_anual_tempo_resposta?operacao=#{@operacao}")
#      @quantitativo_anual = open_flash_chart_object(tamanho_horizontal,tamanho_vertical,"/estatisticas_nfe/grafico_anual_quantitativo?operacao=#{@operacao}")
#
#    else  # default => horário ou instantâneo
#
      filtro = params[:filtro_horario] || {}

      @ano = filtro['ano_mes(1i)'] ? filtro['ano_mes(1i)'].to_i : Time.now.strftime('%Y').to_i
      @mes = filtro['ano_mes(2i)'] ? filtro['ano_mes(2i)'].rjust(2,"0").to_i : Time.now.strftime('%m').to_i
      @dia = filtro['ano_mes(3i)'] ? filtro['ano_mes(3i)'].rjust(2,"0").to_i : Time.now.strftime('%d').to_i

      @tempo_resposta_horario = grafico_horario_tempo_resposta(@ano,@mes,14,@operacao)
      @quantitativo_horario = grafico_horario_quantitativo(@ano,@mes,14,@operacao)

#    end
  end

  def grafico_mensal_tempo_resposta(ano=2009, operacao=0)

    nome_operacao = NOMES_OPERACOES[params[:operacao].to_i]

    logs = Log.scoped_by_operacao_and_ano(OPERACOES[operacao], ano).average('duracao',:group => 'mes', :order => 'mes')

    titulo = "Tempo de Resposta Médio - #{nome_operacao[0,20]} - Mensal\nAno: #{ano}\n "
    texto_x = "Meses"

    configurar_grafico(logs, titulo, texto_x)

  end

  def grafico_mensal_quantitativo(ano=2009, operacao=OPERACOES[5])

    nome_operacao = NOMES_OPERACOES[params[:operacao].to_i]

    logs = Log.scoped_by_operacao_and_ano(OPERACOES[operacao], ano).count('id',:group => 'mes', :order => 'mes')

    titulo = "Número de Acessos - #{nome_operacao[0,20]} - Mensal\nAno: #{ano}\n "
    texto_x = "Meses"

    configurar_grafico(logs, titulo, texto_x, true)

  end

  def grafico_horario_tempo_resposta(ano=2009, mes=07, dia=13, operacao=OPERACOES[5])

    nome_operacao = NOMES_OPERACOES[params[:operacao].to_i]

    logs = Log.scoped_by_operacao_and_ano_and_mes_and_dia(OPERACOES[operacao], ano, mes, dia).average('duracao',:group => 'hora', :order => 'hora')

    titulo = "Tempo de Resposta Médio - #{nome_operacao[0,20]} - Horário\nData: #{dia}/#{mes}/#{ano}\n "
    texto_x = "Horário"

    configurar_grafico(logs, titulo, texto_x, false, true)

  end

  def grafico_horario_quantitativo(ano=2009, mes=07, dia=13, operacao=OPERACOES[5])

    nome_operacao = NOMES_OPERACOES[params[:operacao].to_i]

    logs = Log.scoped_by_operacao_and_ano_and_mes_and_dia(OPERACOES[operacao], ano, mes, dia).count('id',:group => 'hora', :order => 'hora')

    titulo = "Número de Acessos - #{nome_operacao[0,20]} - Horário\nData: #{dia}/#{mes}/#{ano}\n "
    texto_x = "Horário"

    configurar_grafico(logs, titulo, texto_x, true, true)

  end


  def configurar_grafico(dados=[], titulo='Título do Gráfico', texto_x='Legenda X', quantitativo=false, drilldown=false )

    #Titulo, substituindo espaços por + e \n  por |, codificando a url
    chtt = titulo.gsub(' ', '+').gsub("\n",'|')

    #Cor e tamanho da fonte do titulo
    chts="000000,14"

    #Cor das barras do gráfico
    chco="8ee146DD"

    #Cor do gradiente do fundo
    chf="c,lg,90,fbffc3EE,1,FFFFFF,0.5"

    valores = dados.collect { |log|  quantitativo ? log[1] : (log[1].to_f / 1000.0).round(2) }

    #Especifica a série de daods como uma lista de valores separados por ','
    chd = valores.join(",")

    min = valores.sort[0] || 0
    max = valores.sort[-1] || 0
    max = quantitativo ? (max + 1) : max if max > 0

    #Configura a escala da série de dados
    chds= "0,#{max}"
    
    #Configura labels para valores sobre cada barra do gráfico
    precisao_decimal = quantitativo ? 0 : 2
    chm = "N*f#{precisao_decimal}zsy*,000000,0,-1,9"

    #Configura o range (minimo, máximo e incremento) para os labels do eixo y (1o param = 1)
    incremento = quantitativo ? (max + 1) / 10 : ((max - min) / 10.0)
    chxr = "1,0,#{max},#{incremento}"

    #Configura os labels para o eixo x
    labels_x = dados.collect { |log|  log[0] }
    chxl = labels_x.join("|")

    url = "<img src='http://chart.apis.google.com/chart?chs=#{LARGURA}x#{ALTURA}&cht=bvg&chbh=a&chp=0&"

    url << "chco=#{chco}&chf=#{chf}&chtt=#{chtt}&chts=#{chts}&chd=t:#{chd}&chds=#{chds}&chxt=x,y,x&chxl=0:|#{chxl}|2:|#{texto_x}&"
    url << "chxr=#{chxr}&chm=#{chm}' />"
  end

end
